package com.hk.mybatis.result;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hk.mybatis.query.PageResult;
import com.hk.mybatis.query.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

import static org.springframework.http.HttpStatus.OK;

/**
 * 通用Restful接口返回结果
 */
@Slf4j
public class ResponseEntityResult {

    /**
     * 默认错误提示
     *
     * @param <T> 结果内容的类型
     * @return 返回默认出错提示
     */
    public static <T> ResponseEntity<Result<T>> error() {
        return error("操作失败");
    }

    /**
     * 错误提示
     *
     * @param <T>     结果内容的类型
     * @param message 错误消息
     * @return 返回错误提示
     */
    public static <T> ResponseEntity<Result<T>> error(String message) {
        return error(Result.STATUS_FAILED, message);
    }

    /**
     * 错误提示
     *
     * @param message 错误消息
     * @param content 内容
     * @return 返回错误提示
     */
    public static <T> ResponseEntity<Result<T>> error(String message, T content) {
        return error(Result.STATUS_FAILED, message, content);
    }

    /**
     * 错误提示
     *
     * @param message 错误消息
     * @return 返回错误提示
     */
    public static <T> ResponseEntity<PageResult<T>> pageError(String message) {
        return pageError(Result.STATUS_FAILED, message);
    }

    /**
     * 错误提示
     *
     * @param <T>     结果内容的类型
     * @param code    错误码
     * @param message 错误消息
     * @return 返回错误提示
     */
    public static <T> ResponseEntity<Result<T>> error(int code, String message) {
        Result<T> result = new Result<>(code, message);
        log.debug("返回出错信息,result={}", result);
        return new ResponseEntity<>(result, HttpStatus.OK);
    }


    /**
     * 错误提示
     *
     * @param <T>     结果内容的类型
     * @param code    错误码
     * @param message 错误消息
     * @return 返回错误提示
     */
    public static <T> ResponseEntity<Result<T>> error(int code, String message, T content) {
        Result<T> result = new Result<>(code, message, content);
        log.debug("返回出错信息,result={}", result);
        return new ResponseEntity<>(result, HttpStatus.OK);
    }

    /**
     * 错误提示
     *
     * @param code    错误码
     * @param message 错误消息
     * @return 返回错误提示
     */
    public static <T> ResponseEntity<PageResult<T>> pageError(int code, String message) {
        PageResult<T> result = new PageResult<>();
        result.setStatus(code);
        result.setMessage(message);
        log.debug("返回出错信息,result={}", result);
        return new ResponseEntity<>(result, HttpStatus.OK);
    }

    /**
     * 默认成功提示
     *
     * @param <T> 结果内容的类型
     * @return 返回默认成功提示
     */
    public static <T> ResponseEntity<Result<T>> success() {
        Result<T> result = new Result<>();
        return success(result);
    }

    /**
     * 带返回对象的成功提示
     *
     * @param <T>     结果内容的类型
     * @param content 返回对象
     * @return 返回成功提示
     */
    public static <T> ResponseEntity<Result<T>> success(T content) {
        Result<T> result = new Result<>();
        result.setContent(content);
        return success(result);
    }

    /**
     * 带返回对象的成功提示
     *
     * @param <T>    结果内容的类型
     * @param result 返回对象
     * @return 返回成功提示
     */
    public static <T> ResponseEntity<Result<T>> success(Result<T> result) {
        log.debug("返回成功信息,result={}", result);
        return new ResponseEntity<>(result, OK);
    }

    /**
     * 带查询分页对象的成功提示
     *
     * @param <T>  每页中记录的类型
     * @param page 分页结果对象
     * @return 返回带查询分页对象的成功提示
     */
    public static <T> ResponseEntity<PageResult<T>> success(IPage<T> page) {
        PageResult<T> pageResult = new PageResult<>();
        BeanUtils.copyProperties(page, pageResult);
        return new ResponseEntity<>(pageResult, OK);
    }

    /**
     * 带查询分页对象的成功提示，重新构造分页结果时调用
     *
     * @param <T>        每页中记录的类型
     * @param pageResult 分页查询返回结果集
     * @return 返回带查询分页对象的成功提示
     */
    public static <T> ResponseEntity<PageResult<T>> success(PageResult<T> pageResult) {
        return new ResponseEntity<>(pageResult, OK);
    }
}
